﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using RaytracerLib;
using RaytracerLib.Layers;
using RaytracerLib.MathLib;
using RaytracerLib.RenderableObjects;
using RaytracerLib.Postprocessing.LightCorrector;
using RaytracerLib.Resamplers;
using RaytracerLib.Samplers;
using RaytracerLib.Volumes;
using TomanuExtensions;
using RaytracerLib.ShadowTesters;
using RaytracerLib.Attenuations;
using System.Reflection;
using RaytracerLib.Layers.Interpolators;
using RaytracerLib.Layers.OverlayCorrectors;
using RaytracerLib.Lights;
using System.Globalization;
using RaytracerLib.MathLib.Polynomials;
using RaytracerLib.UVMappers;
using RaytracerLib.MathLib.RootFinders;
using YAXLib;
using RaytracerLib.Cameras;
using RaytracerLib.Postprocessing;

namespace Raytracer.Generator
{
    partial class TestScenes
    {
        private static void Generate_0690_0699()
        {
            List.Add(new TestScene()
            {
                Name = "torus moved vs685 mushroom",
                Path = "Torus", 
                Index = 690,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.RenderableObjects["torus"].ScaleX = 0.5;
                    scene.RenderableObjects["torus"].ScaleY = 2;
                    scene.RenderableObjects["torus"].ScaleZ = 1;
                    scene.RenderableObjects["torus"].Pos += new Vector3(1, 0.5, -0.8);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.Mushroom();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 1",
                Path = "Torus", 
                Index = 691,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(-90);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(6, 6, -2);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 2",
                Path = "Torus", 
                Index = 692,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(-90);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(8, 0, -2);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 3",
                Path = "Torus", 
                Index = 693,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(-90);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, 0);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 4",
                Path = "Torus", 
                Index = 694,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(90);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(6, 6, -2);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 5",
                Path = "Torus", 
                Index = 695,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(90);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(8, 0, -2);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 6",
                Path = "Torus", 
                Index = 696,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(90);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, 0);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 7",
                Path = "Torus", 
                Index = 697,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 8",
                Path = "Torus", 
                Index = 698,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(180);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 9",
                Path = "Torus", 
                Index = 699,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });
        }

        private static void Generate_0700_0709()
        {
            List.Add(new TestScene()
            {
                Name = "torus bump 10",
                Path = "Torus", 
                Index = 700,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.RenderableObjects["torus"].ScaleX = 0.5;
                    scene.RenderableObjects["torus"].ScaleY = 2;
                    scene.RenderableObjects["torus"].ScaleZ = 1;
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 11",
                Path = "Torus", 
                Index = 701,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(180);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus bump 12",
                Path = "Torus", 
                Index = 702,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(180);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.RenderableObjects["torus"].ScaleX = 0.5;
                    scene.RenderableObjects["torus"].ScaleY = 2;
                    scene.RenderableObjects["torus"].ScaleZ = 1;
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus inside oneside",
                Path = "Torus", 
                Index = 704,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.Lights["light"].Pos = new Vector3(0, 0, -4);
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 7;
                    scene.ActiveCamera.Pos = new Vector3(0, 0, -11);
                    scene.RenderableObjects["torus"].OneSide = true;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus one side",
                Path = "Torus", 
                Index = 705,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].RotateAroundRight(180);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.RenderableObjects["torus"].ScaleX = 0.5;
                    scene.RenderableObjects["torus"].ScaleY = 2;
                    scene.RenderableObjects["torus"].ScaleZ = 1;
                    scene.RenderableObjects["torus"].OneSide = true;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus inside bump",
                Path = "Torus", 
                Index = 706,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.Lights["light"].Pos = new Vector3(0, 0, -4);
                    scene.RenderableObjects["torus"].RotateAroundRight(-90);
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 12.1;
                    scene.ActiveCamera.Pos = new Vector3(0, 0, -13);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light1"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    scene.Lights["light1"].Pos = new Vector3(0, 4.8, -0.5);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "refraction 1-1.5 torus",
                Index = 707,
                Path = "Torus", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Sphere_Refraction1();
                    Fast(scene);
                    scene.RenderableObjects["sphere"].Remove();
                    TorusObject torus = new TorusObject(Vector3.XAXIS, Vector3.YAXIS)
                    {
                        BigRadius = 1,
                        SmallRadius = 0.25,
                        Pos = new Vector3(0, 0, -2),
                        Name = "torus",
                        DefaultMaterial = TestMaterials.Refractive("Glass", new ColorFloat(0.1), false,
                        RefractiveIndices.OpticGlass1, 0.6, 0.6),
                    };
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 0.1;
                    (scene.ActiveCamera as PerspectiveCamera).FOV = 35;
                    scene.RenderableObjects.Add(torus);
                    torus.RotateAroundRight(-30);
                    torus.RotateAroundForward(-20);
                    torus.ScaleX = 0.5;
                    torus.ScaleY = 2;
                    torus.ScaleZ = 1;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus moved 1",
                Path = "Torus", 
                Index = 708,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(180);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.RenderableObjects["torus"].ScaleX = 0.5;
                    scene.RenderableObjects["torus"].ScaleY = 2;
                    scene.RenderableObjects["torus"].ScaleZ = 1;
                    scene.RenderableObjects["torus"].Pos = new Vector3(0.5, 0, 0);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "torus moved 2",
                Path = "Torus", 
                Index = 709,
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(180);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.RenderableObjects["torus"].ScaleX = 0.5;
                    scene.RenderableObjects["torus"].ScaleY = 2;
                    scene.RenderableObjects["torus"].ScaleZ = 1;
                    scene.RenderableObjects["torus"].Pos = new Vector3(0, 0.5, 0);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });
        }

        private static void Generate_0710_0719()
        {

            List.Add(new TestScene()
            {
                Name = "torus moved 3",
                Index = 710,
                Path = "Torus", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Torus();
                    Fast(scene);
                    scene.RenderableObjects["torus"].DefaultMaterial = TestMaterials.BumpCircle("bump", 0.25, 1);
                    scene.RenderableObjects["torus"].RotateAroundRight(180);
                    scene.RenderableObjects["torus"].RotateAroundRight(-30);
                    scene.RenderableObjects["torus"].RotateAroundForward(-20);
                    scene.RenderableObjects["torus"].ScaleX = 0.5;
                    scene.RenderableObjects["torus"].ScaleY = 2;
                    scene.RenderableObjects["torus"].ScaleZ = 1;
                    scene.RenderableObjects["torus"].Pos = new Vector3(0, 0, 0.5);
                    scene.Lights["light1"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Remove();
                    scene.Lights["light"].Color = ColorFloat.White;
                    scene.Lights["light"].Pos = new Vector3(0, 0, -6);
                    return scene;
                }
            });
        }

        private static void Generate_0720_1059()
        {
            PolynomialSolveMethod[] methods = new PolynomialSolveMethod[] 
            { 
                PolynomialSolveMethod.Algebraic, 
                PolynomialSolveMethod.Sturm
            };

            string[] method_names = new string[] 
            {
                "algebraic", 
                "sturm"
            };

            Vector3[] rotations = new Vector3[] 
            { 
                new Vector3(90, 0, 0), 
                new Vector3(0, 0, 0), 
                new Vector3(-30, 0, -20), 
            };

            Scene[] scenes = new Scene[] 
            { 
                Scenes.Torus(), 
                Scenes.Torus_Refraction(RefractiveIndices.OpticGlass1) 
            };

            string[] scene_names = new string[] 
            { 
                "solid", 
                "refra"
            };

            scenes[0].Lights["light1"].Remove();
            scenes[0].Lights["light2"].Remove();
            scenes[0].Lights["light3"].Remove();
            scenes[0].Lights["light4"].Remove();

            scenes[0].RenderOptions.AmbientColor = ColorFloat.White;
            scenes[0].Materials["blue"].Ambient = null;

            Fast(scenes[0]);
            Fast(scenes[1]);

            scenes[0].ActiveCamera.Pos = new Vector3(0, 0, -3);
            scenes[1].ActiveCamera.Pos = new Vector3(0, 0, -5);

            (scenes[0].ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 0.1;
            (scenes[1].ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 0.1;

            scenes[0].Lights["light"].Color = ColorFloat.White;
            scenes[1].Lights["light"].Color = ColorFloat.White;

            Vector3[] lights_pos = new Vector3[] 
            { 
                new Vector3(0, 0, -5), 
                new Vector3(-3, -3, -5) 
            };

            string[] lights_name = new string[] 
            { 
                "central", 
                "side"
            };

            // R / r
            double[] ratios = new double[] { Double.PositiveInfinity, 100, 20, 6, 1.01, 1, 0.9, 
                                             0.2, 0.05, 0.025, 0.0167, 0.0125, 0.001, 0 };
                
            int index = 720;

            for (int method_index = 0; method_index < methods.Length; method_index++)
            {
                for (int scene_index = 0; scene_index < scenes.Length; scene_index++)
                {
                    for (int rotation_index = 0; rotation_index < rotations.Length; rotation_index++)
                    {
                        for (int light_index = 0; light_index < lights_pos.Length; light_index++)
                        {
                            foreach (var ratio in ratios)
                            {
                                double torus_small_radius = 1 / (1 + ratio);
                                double torus_big_radius = 1 / (1 + 1 / ratio);

                                string sn = String.Format("torus error {0} {1} {2} - {3}, {4}",
                                    method_names[method_index], 
                                    scene_names[scene_index], rotation_index + 1,
                                    ratio.ToString(CultureInfo.InvariantCulture).Replace(",", "."),
                                    lights_name[light_index]);

                                int scene_index_loc = scene_index;
                                int rotation_index_loc = rotation_index;
                                int light_index_loc = light_index;
                                int method_index_loc = method_index;

                                List.Add(new TestScene()
                                {
                                    Name = sn,
                                    Index = index++,
                                    Path = "Torus", 
                                    GetScene = () =>
                                    {
                                        Scene scene = scenes[scene_index_loc].DeepClone();
                                        Fast(scene);

                                        scene.RenderOptions.PolynomialSolveMethod = methods[method_index_loc];

                                        TorusObject torus = scene.RenderableObjects["torus"] as TorusObject;
                                        Light light = scene.Lights["light"];
                                        Camera camera = scene.ActiveCamera;

                                        torus.RotateAroundRight(rotations[rotation_index_loc].X);
                                        torus.RotateAroundUp(rotations[rotation_index_loc].Y);
                                        torus.RotateAroundForward(rotations[rotation_index_loc].Z);

                                        torus.SmallRadius = torus_small_radius;
                                        torus.BigRadius = torus_big_radius;

                                        light.Pos = lights_pos[light_index_loc];

                                        scene.Name = sn;


                                        return scene;
                                    }
                                });
                            }
                        }
                    }
                }
            }
        }

        private static void Generate_1300_1310()
        {
            int index = 1300;

            foreach (var shadow_tester in EnumExtensions.GetValues<ShadowTestMethod>())
            {
                var st = shadow_tester;

                List.Add(new TestScene()
                {
                    Name = String.Format("shadow tester {0}", st), 
                    Path = "Shadow testers", 
                    Index = index++,
                    GetScene = () =>
                    {
                        Scene scene = Scenes.Sphere_Refraction2();
                        Fast(scene);
                        scene.RenderOptions.ShadowTestMethod = st;
                        scene.Materials["Glass"].Attenuation = new ExponentalAttenuation(0.2, 0.2, 0.2);
                        scene.RenderableObjects["plane1"].DefaultMaterial.ReflectionTransmittance = null;
                        scene.RenderableObjects["plane2"].DefaultMaterial.ReflectionTransmittance = null;
                        scene.RenderableObjects["plane3"].DefaultMaterial.ReflectionTransmittance = null;
                        return scene;
                    }
                });
            }
        }

        private static void Generate_1320_1329()
        {
            List.Add(new TestScene()
            {
                Name = "disc",
                Path = "Disc", 
                Index = 1320,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc bigger r",
                Path = "Disc", 
                Index = 1321,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.Radius = 1.2;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc texture",
                Path = "Disc", 
                Index = 1322,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc bump",
                Path = "Disc", 
                Index = 1323,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.EarthBump("earth bump");
                    scene.Lights["light2"].Remove();
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 0.1;
                    scene.ActiveCamera.Pos = new Vector3(0.4, -0.5, -4);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc rotate thin",
                Path = "Disc", 
                Index = 1324,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundRight(90);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc rotate 1",
                Path = "Disc", 
                Index = 1325,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundRight(5);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc rotate 2",
                Path = "Disc", 
                Index = 1326,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundRight(-5);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc rotate 3",
                Path = "Disc", 
                Index = 1327,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundForward(5);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc rotate 4",
                Path = "Disc", 
                Index = 1328,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundForward(-5);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc rotate 5",
                Path = "Disc", 
                Index = 1329,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundUp(5);
                    return scene;
                }
            });
        }

        private static void Generate_1330_1339()
        {
            List.Add(new TestScene()
            {
                Name = "disc rotate 6",
                Path = "Disc", 
                Index = 1330,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundUp(-5);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc scale x",
                Path = "Disc", 
                Index = 1331,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.ScaleX = 0.5;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc scale y",
                Path = "Disc", 
                Index = 1332,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.ScaleY = 0.5;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc scale z",
                Path = "Disc", 
                Index = 1333,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.ScaleZ = 0.5;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc move",
                Path = "Disc", 
                Index = 1334,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.Pos = new Vector3(0.5, 0.7, -3);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc move scale",
                Path = "Disc", 
                Index = 1335,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.Pos = new Vector3(0.5, 0.7, -3);
                    disc.ScaleX = 0.5;
                    disc.ScaleZ = 1.5;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc move rotate",
                Path = "Disc", 
                Index = 1336,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.RotateAroundForward(30);
                    disc.RotateAroundRight(30);
                    disc.Pos = new Vector3(0.5, 0.7, -3);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "disc move rotate scale",
                Path = "Disc", 
                Index = 1337,
                GetScene = () =>
                {
                    Scene scene = Scenes.Disc();
                    Fast(scene);
                    DiscObject disc = scene.RenderableObjects["disc"] as DiscObject;
                    disc.DefaultMaterial = TestMaterials.Mushroom();
                    disc.Pos = new Vector3(0.5, 0.7, -3);
                    disc.RotateAroundForward(30);
                    disc.RotateAroundRight(30);
                    disc.ScaleX = 0.5;
                    disc.ScaleZ = 1.5;
                    return scene;
                }
            });
        }

        private static void Generate_1350_1359()
        {
            List.Add(new TestScene()
            {
                Name = "cone rotate 1",
                Path = "Cone", 
                Index = 1350,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone rotate 2",
                Path = "Cone", 
                Index = 1351,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(90);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone rotate 3",
                Path = "Cone", 
                Index = 1352,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(-90);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone rotate 4",
                Path = "Cone", 
                Index = 1353,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundForward(90);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone small rotate 1",
                Path = "Cone", 
                Index = 1354,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone small rotate 2",
                Path = "Cone", 
                Index = 1355,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.RotateAroundRight(5);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone small rotate 3",
                Path = "Cone", 
                Index = 1356,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.RotateAroundRight(-5);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone small rotate 4",
                Path = "Cone", 
                Index = 1357,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.RotateAroundForward(-5);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone small rotate 5",
                Path = "Cone", 
                Index = 1358,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.RotateAroundForward(5);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone small rotate 6",
                Path = "Cone", 
                Index = 1359,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.RotateAroundUp(-5);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });
        }

        private static void Generate_1360_1369()
        {
            List.Add(new TestScene()
            {
                Name = "cone small rotate 7",
                Path = "Cone", 
                Index = 1360,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.RotateAroundUp(5);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump 1",
                Path = "Cone", 
                Index = 1361,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(-90);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(3, 3, -3);
                    cone.DefaultMaterial = TestMaterials.BumpCircle();
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump 2",
                Path = "Cone", 
                Index = 1362,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(-90);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -3);
                    cone.DefaultMaterial = TestMaterials.BumpCircle();
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump 3",
                Path = "Cone", 
                Index = 1363,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(90);
                    cone.Radius = 1.7;
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(0, 0, -3);
                    cone.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump 4",
                Path = "Cone", 
                Index = 1364,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(90);
                    cone.Radius = 1.7;
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(3, 3, -3);
                    cone.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump 5",
                Path = "Cone", 
                Index = 1365,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(-90);
                    cone.RotateAroundUp(5);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -3);
                    cone.DefaultMaterial = TestMaterials.BumpCircle();
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump 6",
                Path = "Cone", 
                Index = 1366,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(-110);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -4);
                    cone.DefaultMaterial = TestMaterials.BumpCircle();
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump 7",
                Path = "Cone", 
                Index = 1367,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(-90);
                    cone.RotateAroundForward(20);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -4);
                    cone.DefaultMaterial = TestMaterials.BumpCircle();
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump pos",
                Path = "Cone", 
                Index = 1368,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.Pos = new Vector3(1, 0.5, -2.5);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(3, 0.5, -6);
                    cone.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone scale 1",
                Path = "Cone", 
                Index = 1369,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.Scale = new Vector3(1.5, 1, 1);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });
        }

        private static void Generate_1370_1379()
        {
            List.Add(new TestScene()
            {
                Name = "cone scale 2",
                Path = "Cone", 
                Index = 1370,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.Scale = new Vector3(1, 1.5, 1);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone scale 3",
                Path = "Cone", 
                Index = 1371,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.Scale = new Vector3(1, 1, 1.5);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone scale pos 1",
                Path = "Cone", 
                Index = 1372,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.Scale = new Vector3(1.5, 1, 1);
                    cone.Pos = new Vector3(0.3, 0.3, -2.3);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone scale pos 2",
                Path = "Cone", 
                Index = 1373,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.Scale = new Vector3(1, 1.5, 1);
                    cone.Pos = new Vector3(0.3, 0.3, -2.3);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone scale pos 3",
                Path = "Cone", 
                Index = 1374,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.Scale = new Vector3(1, 1, 1.5);
                    cone.Pos = new Vector3(0.3, 0.3, -2.3);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone light inside",
                Path = "Cone", 
                Index = 1375,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(0, 0, -2);
                    cone.DefaultMaterial = TestMaterials.Mushroom();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone refra",
                Path = "Cone", 
                Index = 1376,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone_Refraction();
                    Fast(scene);
                    scene.RenderableObjects["plane1"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane2"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane3"].DefaultMaterial.ReflectionTransmittance = null;
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone refra light inside",
                Path = "Cone", 
                Index = 1377,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone_Refraction();
                    Fast(scene);
                    scene.RenderableObjects["plane1"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane2"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane3"].DefaultMaterial.ReflectionTransmittance = null;
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    scene.Lights[0].Pos = cone.Pos;
                    scene.Lights[2].Remove();
                    scene.Lights[1].Remove();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone bump inside",
                Path = "Cone", 
                Index = 1378,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(160);
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(0, 0, -1.2);
                    cone.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 3.8;
                    (scene.ActiveCamera as PerspectiveCamera).FOV = 25;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone one side",
                Path = "Cone", 
                Index = 1379,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.OneSide = true;
                    cone.RotateAroundRight(160);
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = cone.Pos;
                    cone.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cone.BaseMaterial = TestMaterials.BumpCircle();
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 3.8;
                    return scene;
                }
            });
        }

        private static void Generate_1500_1509()
        {
            List.Add(new TestScene()
            {
                Name = "cylinder rotate 1",
                Path = "Cylinder", 
                Index = 1500,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder rotate 2",
                Path = "Cylinder", 
                Index = 1501,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(90);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder rotate 3",
                Path = "Cylinder", 
                Index = 1502,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(-90);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder rotate 4",
                Path = "Cylinder", 
                Index = 1503,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundForward(90);
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder small rotate 1",
                Path = "Cylinder", 
                Index = 1504,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder small rotate 2",
                Path = "Cylinder", 
                Index = 1505,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.RotateAroundRight(5);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder small rotate 3",
                Path = "Cylinder", 
                Index = 1506,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.RotateAroundRight(-5);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder small rotate 4",
                Path = "Cylinder", 
                Index = 1507,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.RotateAroundForward(-5);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder small rotate 5",
                Path = "Cylinder", 
                Index = 1508,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.RotateAroundForward(5);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder small rotate 6",
                Path = "Cylinder", 
                Index = 1509,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.RotateAroundUp(-5);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });
        }

        private static void Generate_1510_1519()
        {
            List.Add(new TestScene()
            {
                Name = "cylinder small rotate 7",
                Path = "Cylinder", 
                Index = 1510,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.RotateAroundUp(5);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump 1",
                Path = "Cylinder", 
                Index = 1511,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(-90);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(3, 3, -3);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle();
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump 2",
                Path = "Cylinder", 
                Index = 1512,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(-90);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -3);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle();
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump 3",
                Path = "Cylinder", 
                Index = 1513,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(90);
                    cylinder.Radius = 1.4;
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(0, 0, -3);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump 4",
                Path = "Cylinder", 
                Index = 1514,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(90);
                    cylinder.Radius = 1.4;
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(3, 3, -3);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump 5",
                Path = "Cylinder", 
                Index = 1515,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(-90);
                    cylinder.RotateAroundUp(5);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -3);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle();
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump 6",
                Path = "Cylinder", 
                Index = 1516,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(-110);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -4);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle();
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump 7",
                Path = "Cylinder", 
                Index = 1517,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(-90);
                    cylinder.RotateAroundForward(20);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(-3, 3, -4);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle();
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump pos",
                Path = "Cylinder", 
                Index = 1518,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.Pos = new Vector3(1, 0.5, -2.5);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(3, 0.5, -6);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder scale 1",
                Path = "Cylinder", 
                Index = 1519,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.Scale = new Vector3(1.5, 1, 1);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });
        }

        private static void Generate_1520_1529()
        {
            List.Add(new TestScene()
            {
                Name = "cylinder scale 2",
                Path = "Cylinder", 
                Index = 1520,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.Scale = new Vector3(1, 1.5, 1);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder scale 3",
                Path = "Cylinder", 
                Index = 1521,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.Scale = new Vector3(1, 1, 1.5);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder scale pos 1",
                Path = "Cylinder", 
                Index = 1522,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.Scale = new Vector3(1.5, 1, 1);
                    cylinder.Pos = new Vector3(0.3, 0.3, -2.3);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder scale pos 2",
                Path = "Cylinder", 
                Index = 1523,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.Scale = new Vector3(1, 1.5, 1);
                    cylinder.Pos = new Vector3(0.3, 0.3, -2.3);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder scale pos 3",
                Path = "Cylinder", 
                Index = 1524,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    cylinder.Scale = new Vector3(1, 1, 1.5);
                    cylinder.Pos = new Vector3(0.3, 0.3, -2.3);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder light inside",
                Path = "Cylinder", 
                Index = 1525,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(0, 0, -2);
                    cylinder.DefaultMaterial = TestMaterials.Mushroom();
                    cylinder.BottomMaterial = TestMaterials.EarthSimple();
                    cylinder.TopMaterial = TestMaterials.EarthSimple();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder refra",
                Path = "Cylinder", 
                Index = 1526,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder_Refraction();
                    Fast(scene);
                    scene.RenderableObjects["plane1"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane2"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane3"].DefaultMaterial.ReflectionTransmittance = null;
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);

                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder refra light inside",
                Path = "Cylinder", 
                Index = 1527,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder_Refraction();
                    Fast(scene);
                    scene.RenderableObjects["plane1"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane2"].DefaultMaterial.ReflectionTransmittance = null;
                    scene.RenderableObjects["plane3"].DefaultMaterial.ReflectionTransmittance = null;
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(200);
                    scene.Lights[0].Pos = cylinder.Pos;
                    scene.Lights[2].Remove();
                    scene.Lights[1].Remove();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder bump inside",
                Path = "Cylinder", 
                Index = 1528,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(160);
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(0, 0, -0.95);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 3.2;
                    (scene.ActiveCamera as PerspectiveCamera).FOV = 25;
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cylinder one side",
                Path = "Cylinder", 
                Index = 1529,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.OneSide = true;
                    cylinder.RotateAroundRight(160);
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = cylinder.Pos;
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    (scene.ActiveCamera as PerspectiveCamera).MinimalPlaneDistant = 3.2;
                    return scene;
                }
            });
        }

        private static void Generate_1530_1539()
        {

            List.Add(new TestScene()
            {
                Name = "cylinder bump side",
                Path = "Cylinder", 
                Index = 1530,
                GetScene = () =>
                {
                    Scene scene = Scenes.Cylinder();
                    Fast(scene);
                    CylinderObject cylinder = scene.RenderableObjects["cylinder"] as CylinderObject;
                    cylinder.RotateAroundRight(180);
                    scene.Lights["light3"].Remove();
                    scene.Lights["light2"].Remove();
                    scene.Lights["light4"].Color = ColorFloat.White;
                    scene.Lights["light4"].Pos = new Vector3(0, 0, -3.2);
                    cylinder.DefaultMaterial = TestMaterials.BumpCircle("bump circles side", 0.25, 0.25);
                    cylinder.TopMaterial = TestMaterials.BumpCircle();
                    cylinder.BottomMaterial = TestMaterials.BumpCircle();
                    return scene;
                }
            });
        }

        private static void Generate_1560_1569()
        {
            List.Add(new TestScene()
            {
                Name = "cone conical map 1",
                Index = 1560,
                Path = "Cone", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    scene.ActiveCamera.Pos = new Vector3(0, 0, -7);
                    (scene.ActiveCamera as PerspectiveCamera).FOV = 30;
                    scene.RenderableObjects["t1"].Remove();
                    scene.RenderableObjects["t2"].Remove();
                    scene.Lights["light4"].Pos = new Vector3(6, -4, -50);
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(90);
                    cone.Radius = 2;
                    cone.Height = 7.745966692414834;
                    cone.DefaultMaterial = TestMaterials.Cone();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    cone.UVMapper = new ConicalUVMapper();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone conical map 2",
                Index = 1561,
                Path = "Cone", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    scene.RenderableObjects["t1"].Remove();
                    scene.RenderableObjects["t2"].Remove();
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.Radius = 2;
                    cone.Height = 3.4641016151377544;
                    cone.RotateAroundRight(90);
                    cone.DefaultMaterial = TestMaterials.Cone();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    cone.UVMapper = new ConicalUVMapper();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone conical map 3",
                Index = 1562,
                Path = "Cone", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    scene.RenderableObjects["t1"].Remove();
                    scene.RenderableObjects["t2"].Remove();
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.Radius = 2;
                    cone.Height = 2.5;
                    cone.RotateAroundRight(90);
                    cone.DefaultMaterial = TestMaterials.Cone();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    cone.UVMapper = new ConicalUVMapper();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone conical map 4",
                Index = 1563,
                Path = "Cone", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    scene.RenderableObjects["t1"].Remove();
                    scene.RenderableObjects["t2"].Remove();
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.Radius = 2;
                    cone.Height = 1.7638342073763937;
                    cone.RotateAroundRight(90);
                    cone.DefaultMaterial = TestMaterials.Cone();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    cone.UVMapper = new ConicalUVMapper();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone conical map 5",
                Index = 1564,
                Path = "Cone", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    scene.ActiveCamera.Pos = new Vector3(0, 0, -6.5);
                    scene.RenderableObjects["t1"].Remove();
                    scene.RenderableObjects["t2"].Remove();
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.Radius = 1.7;
                    cone.Height = 0.001;
                    cone.RotateAroundRight(90);
                    cone.DefaultMaterial = TestMaterials.Cone();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    cone.UVMapper = new ConicalUVMapper();
                    return scene;
                }
            });

            List.Add(new TestScene()
            {
                Name = "cone conical map 6",
                Index = 1565,
                Path = "Cone", 
                GetScene = () =>
                {
                    Scene scene = Scenes.Cone();
                    Fast(scene);
                    scene.RenderableObjects["t1"].Remove();
                    scene.RenderableObjects["t2"].Remove();
                    ConeObject cone = scene.RenderableObjects["cone"] as ConeObject;
                    cone.RotateAroundRight(200);
                    cone.DefaultMaterial = TestMaterials.Cone();
                    cone.BaseMaterial = TestMaterials.EarthSimple();
                    cone.UVMapper = new ConicalUVMapper();
                    return scene;
                }
            });
        }

        private static void Generate_1590_1659()
        {
            int index = 1590;

            foreach (var rfm in EnumExtensions.GetValues<RootFindingMethod>())
            {
                var rfm_loc = rfm;

                List.Add(new TestScene()
                {
                    Name = String.Format("root finder {0}", rfm_loc),
                    Index = index++,
                    Path = "Root finders", 
                    GetScene = () =>
                    {
                        Scene scene = List.First(el => el.Index == 1048).CreateScene();
                        Fast(scene);
                        scene.RenderOptions.RootFindingMethod = rfm_loc;
                        return scene;
                    }
                });

                List.Add(new TestScene()
                {
                    Name = String.Format("root finder {0}", rfm_loc),
                    Index = index++,
                    Path = "Root finders", 
                    GetScene = () =>
                    {
                        Scene scene = List.First(el => el.Index == 1054).CreateScene();
                        Fast(scene);
                        scene.RenderOptions.RootFindingMethod = rfm_loc;
                        return scene;
                    }
                });
            }
        }

        private static void Generate_1620_1699()
        {
            int index = 1620;

            foreach (var info in PolynomialSurfaces.List)
            {
                PolynomialSurfaceInfo info_local = info;

                List.Add(new TestScene()
                {
                    Name = info_local.Name,
                    Index = index++,
                    Path = "Polynomial surfaces", 
                    GetScene = () =>
                    {
                        Scene scene = Scenes.PolynomialSurface(info_local);
                        Fast(scene);
                        scene.RenderOptions.AmbientColor = new ColorFloat(0.5);
                        PolynomialSurface poly_surf = scene.RenderableObjects[info_local.Name] as PolynomialSurface;
                        poly_surf.Scale = info_local.Scale;
                        poly_surf.LocalBoundBox = info_local.LocalBoundBox;
                        poly_surf.RotateAroundRight(-130);
                        poly_surf.RotateAround(poly_surf.Pos, Vector3.YAXIS, 20);
                        return scene;
                    }
                });

                if (!info_local.Closed)
                    continue;

                List.Add(new TestScene()
                {
                    Name = info_local.Name + " - refra",
                    Path = "Polynomial surfaces", 
                    Index = index++,
                    GetScene = () =>
                    {
                        Scene scene = Scenes.PolynomialSurface_Refraction(info_local);
                        Fast(scene);
                        PolynomialSurface poly_surf = scene.RenderableObjects[info_local.Name] as PolynomialSurface;
                        poly_surf.Scale = info_local.Scale;
                        poly_surf.LocalBoundBox = info_local.LocalBoundBox;
                        poly_surf.RotateAroundRight(-130);
                        poly_surf.RotateAround(poly_surf.Pos, Vector3.YAXIS, 20);
                        return scene;
                    }
                });
            }

            var surfaces = new[] 
            { 
                PolynomialSurfaces.Get("Torus"), 
                PolynomialSurfaces.Get("Sphere"), 
                PolynomialSurfaces.Get("Sphere"),
                PolynomialSurfaces.Get("Heart 1"),
            };

            var uvmappers = new UVMapper[]
            {
                new TorodidalUVMapper(1, 0.5),
                new SphericalUVMapper(),
                new CylindricalUVMapper(), 
                new SphericalUVMapper()
            };

            for (int i = 0; i < surfaces.Length; i++)
            {
                PolynomialSurfaceInfo info_local = surfaces[i];
                UVMapper uvmapper = uvmappers[i];

                List.Add(new TestScene()
                {
                    Name = info_local.Name + " - " + uvmapper.Method.ToString(),
                    Index = index++,
                    Path = "Polynomial surfaces", 
                    GetScene = () =>
                    {
                        Scene scene = Scenes.PolynomialSurface(info_local);
                        scene.RenderOptions.AmbientColor = new ColorFloat(0.5);
                        Fast(scene);
                        PolynomialSurface poly_surf = scene.RenderableObjects[info_local.Name] as PolynomialSurface;
                        poly_surf.Scale = info_local.Scale;
                        poly_surf.LocalBoundBox = info_local.LocalBoundBox;
                        poly_surf.RotateAroundRight(-130);
                        poly_surf.RotateAround(poly_surf.Pos, Vector3.YAXIS, 20);
                        poly_surf.UVMapper = uvmapper;
                        poly_surf.DefaultMaterial = TestMaterials.Mushroom();

                        return scene;
                    }
                });
            }
        }     
    }
}